package com.zoe.onelink.common.enumeration;


import lombok.AllArgsConstructor;

/**
 * <p>标题: 通用异常编码类</p>
 * <p>描述: </p>
 * <p>版权: Copyright (c) 2016</p>
 * <p>公司: 智业软件股份有限公司</p>
 *
 * @version: 1.0
 * @author: cxy
 * @date 2016/10/13
 */
@AllArgsConstructor
public enum ExceptionCodeEnum implements OnelinkExceptionCode {

    /**
     * 成功
     */
    SUCCESS("00000"),

    // region 业务异常 1****

    /**
     * 警告 (已弃用,仅用于兼容旧版编码)
     */
    @Deprecated
    WARN("10000"),
    /**
     * 警告并操作(已弃用,仅用于兼容旧版编码)
     */
    @Deprecated
    WARN_OPERATOR("10001"),

    /**
     * 业务类异常 (大类: 例如空指针异常等常见异常)
     */
    BIZ_ERROR("10100"),
    /**
     * apiKey未授权
     */
    API_KEY_NOT_AUTH("10101"),
    /**
     * 请求时间已过时,请检查本地时间
     */
    CALL_TIME_EXPIRED("10102"),
    /**
     * [{0}]节点不能为空
     */
    KEY_NOT_NULL("10103"),
    /**
     * [{0}]值不能为空
     */
    VALUE_NOT_NULL("10104"),
    /**
     * 系统参数为空
     */
    SYS_PARAM_NULL("10105"),
    /**
     * 找不到业务参数[{0}]
     */
    BIZ_PARAM_NULL("10106"),

    /**
     * sql类异常
     */
    DB_SQL_ERROR("10300"),
    /**
     * 主键冲突
     */
    DB_ID_EXIST("10301"),
    /**
     * 名称冲突
     */
    DB_NAME_EXIST("10302"),
    /**
     * 数据库超时
     */
    DB_TIMEOUT("10303"),
    /**
     * 数据库正忙
     */
    DB_BUSY("10304"),
    /**
     * SQL返回结果集超过{0}行，存在安全隐患，已被自动拦截
     */
    DB_RESULT_OVER_LIMIT("10305"),
    /**
     * SQL注入异常
     */
    SQL_INJECTION("10306"),

    /**
     * 请求参数验证不通过: {0}
     */
    REQ_ARG_NOT_VALID("10400"),

    /**
     * OnelinkToken认证失败
     */
    INVALID_TOKEN("10501"),

    /**
     * OnelinkToken不能为空
     */
    TOKEN_NOT_NULL("10502"),

    /**
     * OnelinkToken自我保护机制异常: {0}
     */
    TOKEN_SELF_PROTECT_FAILURE("10503"),

    /**
     * ONELINK凭证认证信息不能为空
     */
    TOKEN_AUTH_INFO_NOT_BE_EMPTY("10504"),

    /**
     * ONELINK凭证解析失败
     */
    TOKEN_PARSE_FAILURE("10505"),

    // endregion


    // region 系统异常


    // 以下请求参数异常为框架自身解析JSON失败导致的异常,不属于业务异常
    /**
     * 请求参数JSON解析失败，参数位置：[{0}]，参数名称：[{1}]
     */
    REQ_ARG_JSON_PARSE_EXCEPTION("20100"),
    /**
     * 请求参数不能为空，下标：[{0}]，名称：[{1}]
     */
    REQ_ARG_NOT_EMPTY("20101"),
    /**
     * 请求参数扁平化失败，字段名[{0}]重复。
     */
    REQ_ARG_FLATTEN_JSON_KEY_REPEAT("20102"),
    /**
     * 请求参数枚举字段[{0}]转化失败
     */
    REQ_ARG_ENUM_DESERIALIZATION_FAILURE("20103"),

    /**
     * 加密字段序列化失败,加密算法不能为空,加密字段:{0}
     */
    SERIALIZATION_ENCRYPT_ALGORITHM_NOT_NULL("20110"),

    /**
     * 加密字段序列化失败,找不到指定的加密算法:{0}
     */
    SERIALIZATION_ENCRYPT_NO_SUCH_ALGORITHM("20111"),

    /**
     * 创建加密算法[{0}]实例失败,{0}不能为空
     */
    SERIALIZATION_ENCRYPT_KEY_PAIR_NOT_NULL("20112"),

    /**
     * 加密字段[{0}]序列化失败,请检查密文格式或密钥配置是否正确
     */
    SERIALIZATION_ENCRYPT_VALUE_FAILURE("20113"),

    /**
     * 解密字段[{0}]反序列化失败,请检查密文格式或密钥配置是否正确
     */
    DESERIALIZATION_ENCRYPT_VALUE_FAILURE("20114"),

    /**
     * 脱敏字段[{0}]策略绑定失败,找不到指定的脱敏策略:{}
     */
    SERIALIZATION_SENSITIVE_NO_SUCH_STRATEGY("20120"),

    /**
     * 加密算法实例名[{0}]已存在
     */
    SERIALIZATION_ENCRYPT_ALGORITHM_BEAN_NAME_ALREADY_EXISTS("20115"),

    /**
     * 国际化失败异常
     */
    I18N_ERROR("20200"),

    /**
     * 尝试获取Redis分布式锁失败,LockKey:{0}
     */
    REDIS_TRY_GET_LOCK_FAILURE("20301"),

    /**
     * 尝试获取Redis锁[{0}]超过最大重试次数[{1}次]
     */
    REDIS_TRY_GET_LOCK_MAXIMUM_NUMBER_OF_RETRIES_EXCEEDED("20302"),

    /**
     * Redis反序列化异常,RedisKey:{0}
     */
    REDIS_DESERIALIZE_FAILURE("20303"),

    /**
     * 错误的内部接口返回类型 [{0}],请使用ApiResult<返回类型>定义接口
     */
    INCORRECT_INNER_API_RESPONSE_TYPE("20350"),

    /**
     * 接口未找到
     */
    API_NOT_FOUND("20350"),

    /**
     * HTTP请求异常：请求地址[{0}]，请求头[{1}]，请求体[{2}]。由于: {3}
     */
    HTTP_ERROR("30001"),

    /**
     * HTTPS请求异常：请求地址[{0}]，请求体[{1}]。由于: {2}
     */
    HTTPS_ERROR("30002"),

    /**
     * HTTP远程调用返回结果不能为空
     */
    HTTP_RESULT_NOT_NULL("30003"),

    /**
     * HTTP连接建立超时: {0}
     */
    HTTP_CONNECT_TIME_OUT("30004"),

    /**
     * HTTP请求超时: {0}
     */
    HTTP_CALL_TIME_OUT("30005"),

    /**
     * HttpClient不允许使用[HttpClientResponse]作为返回类型
     */
    HTTP_RETURN_TYPE_NOT_ALLOWED("30006"),

    /**
     * HTTP响应体过大: [{} MB]
     */
    HTTP_RESPONSE_DATA_TOO_LARGE("30007"),

    /**
     * 请求过于频繁
     */
    REQUEST_LIMITING("30020"),

    /**
     * webservice入口异常
     */
    WS_ENTER_ERROR("30100"),
    /**
     * webservice出口异常
     */
    WS_OUTER_ERROR("30101"),
    /**
     * [{0}]查询超时
     */
    DAO_QUERY_TIMEOUT("30102"),

    /**
     * 远程调用异常
     */
    RPC_ERROR("30201"),
    /**
     * 内部调用鉴权失败: 无效的RPC_TOKEN
     */
    RPC_TOKEN_NOT_VALID("30202"),

    /**
     * 网关异常
     */
    GATEWAY_ERROR("31000"),

    /**
     * 网关未找到该资源
     */
    GATEWAY_RESOURCE_NOT_FOUND("31001"),

    ;

    // endregion

    /**
     * 响应编码
     */
    private final String code;


    @Override
    public String getCode() {
        return this.code;
    }

    @Override
    public String getMessageKey() {
        return name();
    }

    @Override
    public String toString() {
        return this.getCode();
    }

}
